#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define DATA_SIZE       100     // 内存元素的个数
#define RAND_NUM_RANGE  1000    // 随机数的获取范围

/**
  * @brief  显示数据
  * @note   None
  * @param  data_p：指向要显示数据内存的指针
  *         len：   数据内存的长度
  * @retval None
  */
void INSERT_SORT_Show(int data_p[], int len)
{
    for (int i = 0; i < len; i++)
    {
        printf("%d  ", *(data_p+i));
    }
    printf("\n");
}


/**
  * @brief  获取随机数，并返回
  * @note   None
  * @param  size: rand函数随机数范围的最大值
  * @retval 返回获取得到的随机数
  */
int INSERT_SORT_Rand(int size)
{
    // 1、判断传进来的范围值，是否超出范围
    if(size > 32767)
        return -1;

    // 2、返回随机数
    return rand()%(size+1);
}


/**
  * @brief  选择排序
  * @note   None
  * @param  data_p：指向要排序的内存的指针
  *         len：   排序内存元素的个数
  * @retval None
  */
void INSERT_SORT_DataSort(int data_p[], int len)
{
    if(len <= 1)
        return;

    int tmp_data = 0;
    int i = 0;
    int j = 0;

    for (i = 1; i < len; i++)
    {
        // 每次循环开始要比较的值
        tmp_data = data_p[i];

        // 一次循环的规律
        for (j = i-1; j >= 0; j--)
        {
           if (data_p[j] < tmp_data)
           {
                break;
           }
           else
           {    
                data_p[j+1] = data_p[j];    // 移动数据(向右边移动数据)
           } 
        }
        data_p[j+1] = tmp_data;             // 将比较的数据，插入到比这此循环数据小的前面一个位置
    }
}



int main(int argc, char const *argv[])
{
    // 0、我们是伪随机，所以需要有一个随时变化的种子(时间)
    srand(time(NULL));              

    // 1、随机生成数据
    int data_buf[DATA_SIZE] = {0};
    for (int i = 0; i < DATA_SIZE; i++)
    {
        data_buf[i] =  INSERT_SORT_Rand(RAND_NUM_RANGE);
    }
    
    // 2、打印生成的随机数据(原数据)
    printf("原数据：\n");
    INSERT_SORT_Show(data_buf, DATA_SIZE);

    printf("排序后的数据：\n");
    INSERT_SORT_DataSort(data_buf, DATA_SIZE);
    INSERT_SORT_Show(data_buf, DATA_SIZE);
    
    return 0;
}
